'''
项目：普通函数算法
版本：2.0
日期：2020/2/3
作者：林靖和
功能：用普通函数算法实现特定函数（用函数形式实现）
      1、map函数（功能：对每一个数据执行相同的函数操作）
      2、reduce函数（功能：对所有数据依次执行函数操作）
      3、filter函数（功能：选择出符合判断条件的数据）
'''
from functools import reduce
from collections.abc import Iterable
def main():
    data = range(21)#生成需要被处理的数据列表
    print("part1:map函数")
    print("使用map函数结果：")
    print(list(map(lambda x: x*x,data)))#map函数:[a,b,c]->[a*a,b*b,c*c]
    print(list(map(str, data)))#map函数:[a,b,c]->[str(a),str(b),str(c)]
    print("使用普通函数结果：")
    map_model(lambda x:x*x, data)
    map_model(str, data)
    print("part2:reduce函数")
    print(reduce(lambda x,y: x+y,data))#reduce函数:[a,b,c,d]->((a+b)+c)+d
    print("使用普通函数结果：")
    reduce_model(lambda x, y: x + y, data)
    print("part3:filter函数")
    print(list(filter(lambda x: x % 2 == 1,data)))#reduce函数:[a,b,c]->[符合条件的数]
    print("使用普通函数结果：")
    filter_model(lambda x: x % 2 == 1,data)
def map_model(way,data):
    if isinstance(data, Iterable):
        new_data = []
        for i in range(len(data)):
            new_data.append(way(data[i]))
        print(new_data)
    else:
        print("data not is Iterable")
def reduce_model(way,data):
    if isinstance(data, Iterable):
        if len(data) == 1:
            add = data[0]
        elif len(data) == 2:
            add = way(data[0],data[1])
        else:
            add = data[0] + data[1]
            for i in range(2,len(data)):
                add = way(add,data[i])
        print(add)
    else:
        print("data not is Iterable")
def filter_model(way,data):
    if isinstance(data, Iterable):
        new_data = []
        for i in range(len(data)):
            if way(data[i]):
                new_data.append(data[i])
        print(new_data)
    else:
        print("data not is Iterable")
if __name__ == '__main__':
    main()
# 和我期望的有点出入，高阶函数的话，一般用return好点